home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ For TASM / USRGUIDE.PAK / ENVSTR.ASM < prev    next >
Assembly Source File  |  1996-02-21  |  3KB  |  79 lines

  1. ; Turbo Assembler example. Copyright (c) 1993 By Borland International, Inc.
  2. ;
  3. ; ENVSTR.ASM - Example program to scan the DOS environment
  4. ;
  5. ; Usage: Run tasm on this file and link with envstr.pas
  6.  
  7.  
  8.           .MODEL  large,PASCAL
  9.           .DATA
  10.           EXTRN prefixSeg : WORD  ;gives location of PSP
  11.           .CODE
  12. EnvString PROC FAR  EnvVar:DWORD  RETURNS EnvVal:DWORD
  13.           PUBLIC  EnvString
  14.           cld                     ;work upward
  15.           mov     es,[prefixSeg]  ;look at PSP
  16.           mov     es,es:[2Ch]     ;ES:DI points at environment
  17.           xor     di,di           ;which is paragraph-aligned
  18.           mov     bp,sp           ;find the parameter address
  19.           lds     si,EnvVar       ;which is right above the return address
  20.           ASSUME  ds:NOTHING
  21.           lodsb              ;look at length
  22.           or      al,al      ;is it zero?
  23.           jz      RetNul     ;if so, return
  24.           mov     ah,al      ;otherwise, save in AH
  25.           mov     dx,si      ;DS:DX contains pointer to first parm character
  26.           xor     al,al      ;make a zero
  27. Compare:
  28.           mov     ch,al      ;we want ch=0 for next count, if any
  29.           mov     si,dx      ;get back pointer to string sought
  30.           mov     cl,ah      ;get length
  31.           mov     si,dx      ;get pointer to string sought
  32.           repe    cmpsb      ;compare bytes
  33.           jne     Skip       ;if compare fails, try next string
  34.           cmp     byte ptr es:[di],'='
  35.                              ;compare succeeded; is next char '='
  36.           jne     NoEqual    ;if not, still no match
  37. Found:
  38.           mov     ax,es      ;make DS:SI point to string we found
  39.           mov     ds,ax
  40.           mov     si,di
  41.           inc     si         ;get past the equal (=) sign
  42.           les     bx,EnvVal  ;get address of function result
  43.           mov     di,bx      ;put it in ES:DI
  44.           inc     di         ;get past the length byte
  45.           mov     cl,255     ;set up a maximum length
  46. CopyLoop:
  47.           lodsb              ;get a byte
  48.           or      al,al      ;zero test
  49.           jz      Done       ;if zero, we're done
  50.           stosb              ;put it in the result
  51.           loop    CopyLoop   ;move up to 255 bytes
  52. Done:     not     cl         ;we've been decrementing CL from
  53.                              ; 255 during save
  54.           mov     es:[bx],cl           ;save the length
  55.           mov     ax,@DATA
  56.           mov     ds,ax                ;restore DS
  57.           ASSUME  ds:@DATA
  58.           ret
  59.           ASSUME  ds:NOTHING
  60. Skip:
  61.           dec     di         ;check for null from this char on
  62. NoEqual:
  63.           mov     cx,7FFFh   ;search a long way if necessary
  64.           sub     cx,di      ;environment never >32K
  65.           jbe     RetNul     ;if we're past end, leave
  66.           repne   scasb      ;look for the next null
  67.           jcxz    RetNul               ;exit if not found
  68.           cmp     byte ptr es:[di],al  ;second null in a row?
  69.           jne     Compare              ;if not, try again
  70. RetNul:
  71.           les     di,EnvVal            ;get address of result
  72.           stosb                        ;store a zero there
  73.           mov     ax,@DATA
  74.           mov     ds,ax                ;restore DS
  75.           ASSUME  ds:@DATA
  76.           ret
  77. EnvString ENDP
  78.           END
  79.